
package br.uff.probabilidade.modelo;

import java.awt.Graphics;
import java.awt.Point;
import java.util.Vector;

import br.uff.probabilidade.applet.Atividade;
import br.uff.probabilidade.applet.Tabuleiro;


/**
 * Um elemento da matriz, onde h&aacute; um determinado numero de marcadores.
 * 
 * @poseidon-object-id [I875040m120ee925157mm7ccd]
 */
public class Quadrado {
	
	public Quadrado(Point coordenadas,Point posicao, int width,int height,Vector marcadores){
		this.coordenadas = coordenadas;
		this.posicao = posicao;
		this.width=width;
		this.height = height;
		this.marcadores = marcadores;
	}

/**
 * <p>Coordenada na Matriz do tabuleiro</p>
 */
    private Point coordenadas;

/**
 * <p>Posicao no applet</p>
 */
    private Point posicao;

/**
 * <p>Represents ...</p>
 */
    private int width;

/**
 * <p>Represents ...</p>
 */
    private int height;
/**
 * 
 * 
 */
    private java.util.Vector marcadores = new java.util.Vector();

/**
 * <p>Does ...</p>
 * 
 */
    private int qntEventosHabilitados(){
    	int qnt=0;
    	for(int i=0;i<this.qntMarcadores();i++){
    		if(this.getMarcador(i).getEvento() instanceof Operacao)continue;
    		if(this.getMarcador(i).getEvento().isHabilitado())
    			qnt++;    		
    	}
    	return qnt;
    }
    
    private int[] indicesHabilitados(){
    	int[] indices = new int[this.qntEventosHabilitados()];
    	int count=0;
    	for(int i=0;i<this.qntMarcadores();i++){
    		if(this.getMarcador(i).getEvento() instanceof Operacao)continue;
    		if(this.getMarcador(i).getEvento().isHabilitado()){
    			indices[count] = i;
    			count++;
    		}
    	}
    	return indices;
    }
    
    private int qntOperacoesHabilitados(){
    	int qnt=0;
    	for(int i=0;i<this.qntMarcadores();i++){
    		if(this.getMarcador(i).getEvento() instanceof Operacao){
	    		if(this.getMarcador(i).getEvento().isHabilitado())
	    			qnt++;    		
	    	}
    	}
    	return qnt;
    }
    
    private int[] getOperacoes(){
    	int[] indices = new int[this.qntOperacoesHabilitados()];
    	int count=0;
    	for(int i=0;i<this.qntMarcadores();i++){
    		if(this.getMarcador(i).getEvento() instanceof Operacao){;
	    		if(this.getMarcador(i).getEvento().isHabilitado()){
	    			indices[count] = i;
	    			count++;
	    		}
    		}
    	}
    	return indices;
    }
    
    public void desenha(Graphics g) {      	
        g.drawRect(this.posicao.x, this.posicao.y, this.width, this.height);
        Point marcPosicao;
        	
		int[] habilitados = this.indicesHabilitados();
		
		int[] operacoes = this.getOperacoes();
		
		int total = habilitados.length;
		if(total>Tabuleiro.QNT_EVENTOS)total =Tabuleiro.QNT_EVENTOS; 
		
		int gapX = (Tabuleiro.ESPACO_COLUNAS-(total*Marcador.DEFAULT_WIDTH))/(total+1);
    	int posY = posicao.y+ this.height/2 - (Marcador.DEFAULT_HEIGHT) ;
    	int countColuna = 0;
    	int countLinha = 0;
    	//System.out.println("QNT Habilitados: "+habilitados.length);
    	for(int i=0;i<habilitados.length;i++){    		
    		marcPosicao = new Point(posicao.x+gapX+ ((Marcador.DEFAULT_WIDTH+gapX)*(countColuna)) ,posY);
    		this.getMarcador(habilitados[i]).setPosicao(marcPosicao);
    		this.getMarcador(habilitados[i]).desenha(g);
    		countColuna++;
    		if(countColuna==3){    			
    			countLinha++;
    			total = habilitados.length-countColuna;
    			countColuna=0;    			
    			if(total>Tabuleiro.QNT_EVENTOS)total =Tabuleiro.QNT_EVENTOS;
    			
    			gapX = (Tabuleiro.ESPACO_COLUNAS-(total*Marcador.DEFAULT_WIDTH))/(total+1);
    			
    			posY =  posicao.y+ this.width/2 + (Marcador.DEFAULT_HEIGHT*countLinha) ;
    		}
    	}
    	
    	total = operacoes.length;
    	gapX = (Tabuleiro.ESPACO_COLUNAS-(total*Marcador.DEFAULT_WIDTH))/(total+1);
    	countLinha= 1;
    	countColuna=0;  
    	posY =  posicao.y+ this.height/2 + (Marcador.DEFAULT_HEIGHT*countLinha) ;
    	for(int i=0;i<operacoes.length;i++){    		
    		marcPosicao = new Point(posicao.x+gapX+ ((Marcador.DEFAULT_WIDTH+gapX)*(countColuna)) ,posY);
    		this.getMarcador(operacoes[i]).setPosicao(marcPosicao);
    		this.getMarcador(operacoes[i]).desenha(g);
    		countColuna++;    		
    	}
    } 

/**
 * <p>Does ...</p>
 * 
 * @poseidon-object-id [I875040m120ee925157mm79e1]
 * @param click 
 * @return 
 */
    public boolean checkClick(Point click) {        
    	if(click.x>this.posicao.x && click.x<this.posicao.x+this.width && click.y>this.posicao.y && click.y<this.posicao.y+this.height){    	
            //this.checkMarcadores(click);
            System.out.println("Clicou no quadrado ("+this.coordenadas.x+","+this.coordenadas.y+")");
            return true;
        }
        return false;
    } 

/**
 * <p>Does ...</p>
 * 
 * @poseidon-object-id [I875040m120ee925157mm79a1]
 * @param click 
 * @return 
 */
    private boolean checkMarcadores(Point click) {        
        for(int i=0;i<this.qntMarcadores();i++){
        	if(this.getMarcador(i).checkClick(click))
        		return true;
        }
        return false;
    } 
    
    public int qntMarcadores(){
    	return this.marcadores.size();
    }
    
    public Marcador getMarcador(int index){
    	if(this.marcadores.get(index)!=null){
    		return (Marcador)this.marcadores.get(index);
    	}
    	return null;
    }

	public Point getCoordenadas() {
		return coordenadas;
	}

	public void setCoordenadas(Point coordenadas) {
		this.coordenadas = coordenadas;
	}
 }
